<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型关系详解</title>
</head>
<body>
    <script>
        let obj = new Object();
        // obj是Object实例化出来的一个对象
        console.dir(obj);

        // Object跟函数一样，有两个原型，一个是给Object自己用的__proto__原型，另一个是给实例化对象用的prototype用的原型
        console.dir(Object);


        // 给Object的prototype创建一个方法
        Object.prototype.show = function(){
            console.log("我是Object实例化对象的方法");
        };
        obj.show();


        function User(){}
        // 创建一个User函数，会发现，它的两个原型__proto__和prototype,都有Object原型，且里面都有show()方法，说明这两个都指向Object的prototype原型
        console.dir(User);

        let lisi = new User();
        // 判断User的__proto__原型是不是和User的实例化对象的原型(User的prototype)指向的是同一个
        console.log(User.__proto__.__proto__ == User.prototype.__proto__);
        console.log(User.__proto__.__proto__ == lisi.__proto__.__proto__);

        // 所以User的实例化方法、User对象、Object的实例化方法都可以调用show方法
        lisi.show();
        User.show();
        obj.show();


        // Object的prototype的原型为null
        console.log(Object.prototype.__proto__);
    </script>
</body>
</html>